	*! version 2.1 1Nov2016  Kristoffer Bjarkefur kbjarkefur@worldbank.org
	
	capture program drop ieboilsave 
	program ieboilsave , rclass
	
		syntax ,  IDVARname(varlist) [DIOUTput missingok tagnoname tagnohost]
		
		qui {
		
		preserve
			
			local origversion "`c(version)'"
			
			version 10.0
	
			//Checking that only one id variable is listed
			if `:list sizeof idvarname' > 1 {
				
				noi di as error "{phang}Multiple ID variables in idvarname(`idvarname') are not allowed. While it is not always incorrect, it is bad practice, see {help ieboilsave##IDnotes:Notes on ID variables} for more details.{p_end}"
				noi di ""
				error 103
				exit
			}
			
	
		/*********************************
		
			ID variables
		
		*********************************/
	
			capture isid `idvarname'
			
			if _rc {
			
			
				//Test missing
				capture assert !missing(`idvarname')
				if _rc {
				
					count if missing(`idvarname')
					
					noi di as error "{phang}The ID variable `idvarname' is missing in `r(N)' observation(s). The ID variable needs to be fully identifying, meaning that no values can be a missing values (., .a, .b ... .z) or the empty string{p_end}"
					noi di ""
				}
				
				//Test duplicates
				tempvar iedup
				
				duplicates tag `idvarname', gen(`iedup')
					
				count if `iedup' != 0
				
				if r(N) > 0 {
				
					sort `idvarname'
				
					noi di as error "{phang}To be uniquely identifying the ID variable should not have any duplicates. The ID variable `idvarname' has duplicate observations in the following values:{p_end}"
					noi list `idvarname' if `iedup' != 0
				}
				noi di ""
				error 148
				exit
			} 
	
		
	
		/*********************************
		
			Missing values
		
		*********************************/
			
			if "`missingok'" == "" {
			
				local varsStandMiss		
			
				ds, has(type numeric)
				
				foreach variable in `r(varlist)' {
				
					cap assert `variable' != .
				
					if _rc {
					
						local varsStandMiss `varsStandMiss' `variable'
					}
				}
				
				if `:list sizeof varsStandMiss' > 0 {
					
					noi di as error "{phang}There are `:list sizeof varsStandMiss' numeric variable(s) that contains the standard missing value (.) which is bad practice. A list of the variable(s) are stored in the local {cmd:r(standmissvars)}. Extended missing variables should be used. See {help ieboilsave} for more details.{p_end}"
						
					return local standmissvars 	"`varsStandMiss'"
					
					error 416
					exit
				}
			}
			
		restore	
				
		/*********************************
		
			Output success messages
		
		*********************************/		
		
		// ID
		
		//Store the name of idvar in data set char and in notes
		char  _dta[ie_idvar] "`idvarname'"
		
		local idOut "The uniquely and fully identifying ID variable is `idvarname'. "
		
		
		// Version 
		char  _dta[ie_version] "`origversion'"
		
		local versOut "This data set was created in Stata version `origversion'"
	
		// Date
		char  _dta[ie_date] "`c(current_date)'"
	
		local dateOut " on `c(current_date)'."
		
		// Name 
		
		local nameOut ""
		local hostOut ""
		
		if "`tagnoname'" == "" {
			
			char  _dta[ie_name] "`c(username)'"
			
			if "`tagnohost'" == "" {
				
				char  _dta[ie_host] "`c(hostname)'"
				local hostOut ", by user `c(username)' using computer `c(hostname)',"
			}
			else {
			
				local nameOut ", by user `c(username)',"
			
			}
		}
	// Missing vars
	
		if "`missingok'" == "" {
		
			local missOut "There are no regular missing values in this data set"
		}
		else {
		
			local missOut "This data set was not tested for missing values"
		}
		
		char _dta[ie_boilsave] "ieboilsave ran successfully. `idOut'`versOut'`nameOut'`hostOut'`dateOut' `missOut'"
		
		if "`dioutput'" != "" {
		
			local  outputSum :  char _dta[ie_boilsave]
			noi di ""
			noi di  "{phang}`outputSum'{p_end}"
			
		}
			
	}
	end 
